home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / login.zip / CRYPT.C < prev    next >
C/C++ Source or Header  |  1991-02-03  |  2KB  |  77 lines

  1. #include <stdio.h>
  2. char *encrypt(), *decrypt();
  3. #ifdef MAIN
  4. main(argc,argv)
  5. int argc;
  6. char **argv;
  7. {
  8.     char *p, *q;
  9.     int x;
  10.  
  11.     p=encrypt(argv[1]);
  12.     printf("p=[%s]\n", p);
  13.     q=decrypt(p);
  14.     printf("q=[%s]\n", q);
  15.     printf("strcmp(argv[1], q)=%d\n", strcmp(argv[1], q));
  16. }
  17.  
  18. #endif
  19.  
  20. char *
  21. encrypt(linebuf)
  22. char    *linebuf;
  23. {
  24.     int linelen = strlen(linebuf);
  25.     char *cp, *dp;
  26.     char *buffer;
  27.  
  28.     buffer = (char *)calloc(1, 256);
  29.     dp = buffer;
  30.     *dp = (' ' + linelen); /* Record length */
  31.     ++dp;
  32.     for(cp = linebuf; cp < &linebuf[linelen]; cp += 3) {
  33.         *dp++ = (' ' + ((cp[0] >> 2) & 0x3f));
  34.         *dp++ = (' ' + (((cp[0] << 4) & 0x30) | ((cp[1] >> 4) & 0xf)));
  35.         *dp++ = (' ' + (((cp[1] << 2) & 0x3c) | ((cp[2] >> 6) & 0x3)));
  36.         *dp++ = (' ' + (cp[2] & 0x3f));
  37.     }
  38.     *dp = '\0';
  39.  
  40.     while ((dp = (char *)strchr(buffer, ':')) != NULL)
  41.         *dp = '\01';
  42.  
  43.     return (buffer);
  44. }
  45.  
  46. char *
  47. decrypt(linebuf)
  48. char *linebuf;
  49. {
  50.     int linelen, i;
  51.     char *cp, *dp;
  52.     char *buffer;
  53.  
  54.     buffer = (char *)calloc(1, 256);
  55.  
  56.     while ((dp = (char *)strchr(linebuf, '\01')) != NULL)
  57.         *dp = ':';
  58.  
  59.     linelen = linebuf[0] - ' ';
  60.     if(linelen == 0)
  61.         return (NULL);
  62.  
  63.     dp = buffer;
  64.     for(cp = &linebuf[1];linelen > 0;cp += 4){
  65.         for(i=0;i<4;i++)
  66.             cp[i] -= ' ';
  67.         *dp++ = ((cp[0] << 2) | ((cp[1] >> 4) & 0x3));
  68.         if(--linelen > 0)
  69.             *dp++ = ((cp[1] << 4) | ((cp[2] >> 2) & 0xf));
  70.         if(--linelen > 0)
  71.             *dp++ = ((cp[2] << 6) | cp[3]);
  72.         linelen--;
  73.     }
  74.     *dp = '\0';
  75.     return (buffer);
  76. }
  77.